
/**
 * Module dependencies.
 */

var express = require('express');
var routes  = require('./routes');
var user    = require('./routes/user');
var http    = require('http');
var path    = require('path');
var os      = require('os');
var soynode = require('soynode');
var mysql   = require('mysql');
var pool    = mysql.createPool({
    host     : 'localhost',
    user     : 'root',
    password : 'RodZewCh',
    database : 'express-cars'
});

soynode.setOptions({
    'outputDir'             : os.tmpdir(),
    'uniqueDir'             : true,
    'allowDynamicRecompile' : true, // TODO: значение под вопросом !!!
    'eraseTemporaryFiles'   : true
});

var app = express();

// all environments
app.set('port', process.env.PORT || 3000);
app.set('views', path.join(__dirname, 'views'));



app.set('view engine', 'soy');
app.engine('soy', function(_path, options, callback) {
    var templatePath = _path.replace(path.normalize(this.root + '/'), '');
    templatePath = templatePath.replace('.soy', path.sep + 'render');
    templatePath = templatePath.split(path.sep).join('.');
    callback(null, options.soynode.render(templatePath, options));
});
app.use(function(req, res, next) {
    res.locals.soynode = soynode;
    next();
});

app.use(express.favicon());
app.use(express.logger('dev'));
app.use(express.json());
app.use(express.urlencoded());
app.use(express.methodOverride());
app.use(app.router);
app.use(require('less-middleware')({ src: path.join(__dirname, 'public') }));
app.use(express.static(path.join(__dirname, 'public')));

// development only
if ('development' == app.get('env')) {
  app.use(express.errorHandler());
}

app.get('/', routes.index);
app.get('/users', user.list);
app.get('/templates', function (req, res) {
    res.send(200, JSON.stringify(soynode));
    var keys = [];
    for (var index in soynode) {
        keys.push(index);
    }
    console.log(keys);
});

app.get('/admin/brands', function(req, res){
    var mysql      = require('mysql');
    var connection = mysql.createConnection({
        host     : 'localhost',
        user     : 'root',
        password : 'RodZewCh',
        database : 'express-cars'
    });
    connection.connect();

    connection.query( 'SELECT * FROM brands;', function(error, rows) {
        if (error) {
            res.render('error', {
                message : (new Error(error)).message
            });
        } else {
            res.render('admin/brands', {
                title : 'Марки автомобилей',
                rows : rows
            });
        }
    });
});

// Обработка сохранения данных.
app.post('/admin/models', function(request, response) {
    var query,
        insert    = [
            'INSERT INTO `models` (`brand`, `name`, `acronym`, `address`, `passenger`) ',
            'VALUES (#{brand}, #{name}, #{acronym}, #{address}, #{passenger});'].join('\n'),
        update    = [
            'UPDATE `models` SET               ',
            '       `brand`     = #{brand},    ',
            '       `name`      = #{name},     ',
            '       `acronym`   = #{acronym},  ',
            '       `address`   = #{address},  ',
            '       `passenger` = #{passenger} ',
            ' WHERE `id`        = #{id};'].join('\n'),
        body      = request.body,
        id        = parseInt(String(body.id || ''), 10) || 0,    // Идентификатор записи, если редактируется.
        brand     = parseInt(String(body.brand || ''), 10) || 0, // Идентификатор марки модели.
        name      = String(body.name || '').                     // Название модели.
            split(/\s+/).join(' ').
            split(/^\s+/).join('').
            split(/\s+$/).join(''),
        acronym   = String(body.acronym || '').                   // Сокращенное название модели.
            split(/\s+/).join(' ').
            split(/^\s+/).join('').
            split(/\s+$/).join(''),
        address   = String(body.address || '').                   // Адрес модели.
            split(/\s+/).join(' ').
            split(/^\s+/).join('').
            split(/\s+$/).join(''),
        passenger = ['true', 'yes', 'on', '1'].                   // Признак, что модель легковая.
            indexOf(String(body.passenger || '').
                split(/\s+/).join(' ').
                split(/^\s+/).join('').
                split(/\s+$/).join('').
                toLowerCase()) !== -1 ? 'yes' : 'no';
    if (brand <= 0) {
        // Делаем переадресацию с признаком ошибки.
        response.redirect('/admin/models?failure=brand');
    } else if (!name) {
        // Делаем переадресацию с признаком ошибки.
        response.redirect('/admin/models?failure=name');
    } else if (!acronym) {
        // Делаем переадресацию с признаком ошибки.
        response.redirect('/admin/models?failure=acronym');
    } else if (!address) {
        // Делаем переадресацию с признаком ошибки.
        response.redirect('/admin/models?failure=address');
    } else {
        pool.getConnection(function(error, connection) {
            if (error) {
                // Обрабатываем ошибку соединения.
                response.render('error', {
                    message : (new Error(error)).message
                });
            } else {
                // Определяем какой запрос должен работать.
                query = (id > 0 ? update : insert).
                    split('#{id}').        join(String(id)).
                    split('#{brand}').     join(String(brand)).
                    split('#{name}').      join(connection.escape(name)).
                    split('#{acronym}').   join(connection.escape(acronym)).
                    split('#{address}').   join(connection.escape(address)).
                    split('#{passenger}'). join(connection.escape(passenger));
                // Выполняем запрос к базе данных.
                connection.query(query, function (error) {
                    if (error) {
                        // Обрабатываем состояние ошибки.
                        response.render('error', {
                            message : (new Error(error)).message
                        });
                    } else {
                        // Возвращаем соединение в пул.
                        connection.release();
                        // Делаем переадресацию с признаком успеха.
                        response.redirect('/admin/models?success');
                    }
                });
            }
        });
    }
});
app.get('/admin/models/page/:id', function (request, response) {
    response.send('user ' + request.params.id);
});
app.get('/admin/models', function(request, response) {
    response.render('admin/models', {
        'title'   : 'Модели автомобилей',
        'method'  : 'post',
        'action'  : '/admin/models',
        'rows'    : [],
        'gridColumns' : [
            {
                'name'  : 'id',
                'title' : '#'
            },
            {
                'name'  : 'name',
                'title' : 'Название'
            },
            {
                'name'  : 'brand',
                'title' : 'Марка'
            },
            {
                'name'  : 'acronym',
                'title' : 'Сокращенно'
            },
            {
                'name'  : 'address',
                'title' : 'Адрес'
            },
            {
                'name'  : 'passenger',
                'title' : 'Легковой'
            }
        ],
        'gridRows' : [],
        'columns' : [
            // Марка автомобиля
            {
                'name'     : 'brand',
                'type'     : 'select',
                'label'    : 'Марка автомобиля',
                'value'    : null,
                'required' : true
            },
            // Название модели
            {
                'name'     : 'name',
                'type'     : 'text',
                'label'    : 'Название модели',
                'value'    : null,
                'required' : true
            },
            // Сокращенное
            {
                'name'     : 'acronym',
                'type'     : 'text',
                'label'    : 'Сокращенное',
                'value'    : null,
                'required' : true
            },
            // Адрес
            {
                'name'     : 'address',
                'type'     : 'text',
                'label'    : 'Адрес',
                'value'    : null,
                'required' : true
            },
            // Легковой
            {
                'name'     : 'passenger',
                'type'     : 'checkbox',
                'label'    : 'Легковой',
                'value'    : null,
                'required' : false
            }

        ]
    });
});

http.createServer(app).listen(app.get('port'), function(){
  console.log('Express server listening on port ' + app.get('port'));
});

//soynode.compileTemplates('views', function(err) {
//    if (err) throw err;
//    http.createServer(app).listen(app.get('port'), function(){
//        console.log('Express server listening on port ' + app.get('port'));
//    });
//});